Carregando bibliotecas
library(DT)
library(MASS)
library(dplyr)
library(stats)
library(plotly)
library(readxl)
library(caTools)
library(ggplot2)
library(corrplot)
library(neuralnet)
library(reticulate)
Uma rede neural consiste no agrupamento de modelagens matemáticas de neurônios biológicos. Dessa forma, entradas numéricas são ponderadas e combinadas linearmente para a geração de um determinado output.
O algoritmo da retropropagação pode ser separado em duas partes, em uma visão superficial sobre o mesmo. A primeira parte consiste na passagem das entradas através da rede e calculo da saída. Na segunda parte ocorre o cálculo do gradiente, baseado na saída, e a sua utilização para recalcular todos os pesos da rede neural.
As RNAs são aplicadas em diversas áreas, alguns exemplos são: medicina, economia, visão computacional, classificação de emails e muitas outras aplicações. Os benefícios de sua aplicação são grandes e podem ser análisados com devida atenção em cada área especcificadamente, entretanto um benefício geral é a adaptabilidade da RNA e sua alta acurácia.
# Normaliza DF
normaliza_df <- function(df) {
maximo <- apply(df, 2, max)
minimo <- apply(df, 2, min)
res <- as.data.frame(scale(df, center = minimo, scale = maximo - minimo))
return(res)
}
set.seed(12)
# Leitura DataSet
df_boston <- MASS::Boston
# Visualizção variável alvo
p <- df_boston %>%
ggplot(aes(y = medv, x = seq(nrow(df_boston)))) +
geom_point() +
xlab("")
ggplotly(p)
# Normalização
df_norm <- normaliza_df(df_boston)
# Visualização correlação das variáveis
correl <- cor(df_norm)
corrplot(correl,
type = "upper",
tl.col = "black",
method = "number",
bg = "lightblue")
#Divisão do DF para teste e treino 70/30
divisao_df = sample.split(df_norm$medv, SplitRatio = 0.70)
df_treino = subset(df_norm, divisao_df == TRUE)
df_teste = subset(df_norm, divisao_df == FALSE)
# Criação do Modelo
eq <- as.formula("medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + tax + ptratio + black + lstat")
rna <- neuralnet(eq, data = df_treino, hidden = c(5,3), linear.output = TRUE)
plot(rna, rep = "best")
# Testando Modelo
predicao <- neuralnet::compute(rna, df_teste)
maximo <- max(df_boston$medv)
minimo <- min(df_boston$medv)
predicao <- predicao$net.result*(maximo - minimo) + minimo
df_teste <- df_teste$medv*(maximo - minimo) + minimo
# Erro Quadrático Médio
eqm <- sum(((df_teste - predicao)^2) )/nrow(predicao)
eqm
## [1] 18.39747
# Realizando plot dos erros
df_pred <- data.frame(df_teste, predicao)
# Plot dos erros
p <- df_pred %>%
ggplot(aes(x = df_teste, y = predicao)) +
geom_point() +
stat_smooth() +
xlab('Dados de Teste') +
ylab('Predições')
ggplotly(p)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Pode-se notar que a rede neural obteve um resultado melhor, visto que ela conseguiu identificar uma dinâmica entre as variáveis, não se limitando a uma relação linear.